package com.itheima.stock.stream;

import com.itheima.stock.pojo.Account;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;

@SpringBootTest
public class StreamDemo5 {

    /*
        Stream流的收集操作 : 第一部分

                需求：过滤元素并遍历集合
                定义一个集合，并添加一些整数1，2，3，4，5，6，7，8，9，10
                将集合中的奇数删除，只保留偶数。
                遍历集合得到2，4，6，8，10

                结论：在Stream流中无法直接修改集合,数组等数据源中的数据。
            */
    @Test
    public void Test5() {
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 1; i <= 10; i++) {
            list.add(i);
        }
        // 1. 创建Stream流
        Stream<Integer> stream = list.stream();
        // 2. 过滤偶数
        List<Integer> collect = stream.filter(num -> num % 2 == 0).collect(Collectors.toList());
        System.out.println(collect);
        System.out.println("=============");
        // 3.结论：在Stream流中无法直接修改集合,数组等数据源中的数据。
        System.out.println(list);
    }
    /*

        Stream流的收集操作 : 第二部分

        使用Stream流的方式操作完毕之后，我想把流中的数据起来，该怎么办呢？

        Stream流的收集方法
        R collect(Collector collector) : 此方法只负责收集流中的数据 , 创建集合添加数据动作需要依赖于参数

        工具类Collectors提供了具体的收集方式
        public static <T> Collector toList()：把元素收集到List集合中
        public static <T> Collector toSet()：把元素收集到Set集合中
        public static  Collector toMap(Function keyMapper,Function valueMapper)：把元素收集到Map集合中


        需求 :
            定义一个集合，并添加一些整数1，2，3，4，5，6，7，8，9，10
            将集合中的奇数删除，只保留偶数。
            遍历集合得到2，4，6，8，10
     */
    @Test
    public void Test6() {
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 1; i <= 10; i++) {
            list.add(i);
        }
        list.add(10);
        list.add(10);
        list.add(10);
        list.add(10);
        list.add(10);

        // collect只负责收集流中的数据
        // Collectors.toList()会负责在底层创建list集合 ,并把数据添加到集合中 , 返回集合对象
        List<Integer> list2 = list.stream().filter(num -> num % 2 == 0 ).collect(Collectors.toList());
        System.out.println(list2);

        //set集合元素不重复
        Set<Integer> set = list.stream().filter(num -> num % 2 == 0 ).collect(Collectors.toSet());
        System.out.println(set);

    }
    /*
        Stream流的收集操作 : 第三部分

        1 创建一个ArrayList集合，并添加以下字符串。字符串中前面是姓名，后面是年龄
            "zhangsan,23"
            "lisi,24"
            "wangwu,25"
        2 保留年龄大于等于24岁的人，并将结果收集到Map集合中，姓名为键，年龄为值

        收集方法 :
        public static  Collector toMap(Function keyMapper  ,   Function valueMapper)：把元素收集到Map集合中
     */
    @Test
    public void Test7() {
        ArrayList<String> list = new ArrayList<>();
        list.add("zhangsan,23");
        list.add("lisi,24");
        list.add("wangwu,25");
        Map<String, String> collect = list.stream()
                .filter(s -> {
                    String ageStr = s.split(",")[1];
                    int age = Integer.parseInt(ageStr);
                    return age >= 24;
                })
                .collect(Collectors.toMap(s -> s.split(",")[0],
                        s -> s.split(",")[1]));
        System.out.println(collect);

    }

    /**
     * 将Map 转化为 Account
     */
    @Test
    public void Test8() {
        HashMap<String, String> hm = new HashMap<>();
        hm.put("11", "曹植");
        hm.put("22", "曹丕");
        hm.put("33", "曹熊");
        hm.put("44", "曹冲");
        hm.put("55", "曹昂");
        List<String> collect = hm.keySet().stream().filter(s -> Integer.parseInt(s) > 33).collect(Collectors.toList());
        System.out.println(collect);

        hm.entrySet().stream().filter(s -> Integer.parseInt(s.getKey()) > 33).forEach(s -> System.out.println(s.getValue()));

        List<Account> list = hm.entrySet().stream()
                .map(s -> {
                    Account account = new Account();
                    account.setUserName(s.getValue());
                    account.setAge(Integer.parseInt(s.getKey()));
                    return account;
                })
                .collect(Collectors.toList());
        System.out.println(list);
    }
}
